home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Retro Gamer 15
/
Retro Gamer 15.iso
/
MSX Emulators
/
blueMSXv160.exe
/
Contrib
/
cbios
/
src
/
cb_main.a80
< prev
next >
Wrap
Text File
|
2003-08-13
|
75KB
|
3,651 lines
; C-BIOS ver 0.17
;
; Copyright (c) 2002-2003 BouKiCHi. All rights reserved.
; Copyright (c) 2003 Reikan. All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
; 1. Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
;
; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;
;
; [date]
; 2002-08-07 start development.
; 2002-08-09 it's my birthday,this version was playable games.
; 2002-08-13 added fonts and key input routine,displayed infomation.
;
; 2002-08-15 improved cartridge knowledge.
; 2002-08-19 added DCOMPR function and adjusted wait.
; 2002-08-20 added initilize table of $fcc2-$fcc4
; added in_joy and in_trig
; filesize reduced from 32KB to 16KB.
; set.bat can be restoring for only 32kb readable emulators.
; 2002-08-21 name of this project was changed.
; 2002-08-24 added INITGRP,CHGMOD and sound_init.
; 2002-08-26 added initialize value of GRP??? and MLT???.
; re-adjust memory ack function.
; added calling H.STKE function.
; re-adjust routines.
; 2002-08-27 added sound mode.
; syntax adjust for other assemblers.
; fixed RDPRIM.
; 2002-09-08 fixed WRSLT.
; added keyboard routine.
; added GTSTCK and GTTRIG.
; 2002-09-10 improved clearing memory routine.
; added memory saving trap.
; 2002-09-11 added print_error function.
; added ROM searching and fixed usage of EXPTBL.
; 2002-09-12 initilize from RG8SAV to RG23
; ENASLT returns state of disable interrupt.
; 2002-09-16 added half of system font.
; 2002-09-18 added CHPUT routine.
; rewrite curs2de and de2curs routine again.
; 2002-09-19 improved stroke speed of keyboard input.
; added scroll routines.
; fixed init_grp.
; 2002-09-22 fixed init_sc5.
; 2002-09-23 added disk routine.
; 2002-09-25 rewrite ENASLT.
; added init_sc7.
; 2002-09-26 fixed keyboard routine.
; 2002-10-02 improved init_sc5.
; 2003-04-16 divided sound routine from main kernel.
; 2003-06-01 fixed chgmod related. (init_txt, init_txt32 font load added)
; fixed curs2de, de2curs (screen1 support added)
; 2003-08-10 fixed clear problem in init_txt, init_txt32.
; fixed scroll in CHPUT on txt40/graphic1 modes.
; title "C-BIOS ver 0.17 by BouKiCHi/Reikan"
;---------------------------------------------------
; I/Oé╞âtâbâNé╠ÆΦï`
PRN_STAT equ $90 ; âvâèâôâ^é╠âXâeü[â^âX
VDP_RP equ $98 ; VDPâ|ü[âgô╟é▌Åoé╡
VDP_STAT equ $99 ; VDPâXâeü[â^âXüAâëâbâ`âèâZâbâgüB
PSL_STAT equ $A8 ; âXâìâbâgâXâeü[â^âX
KBD_STAT equ $A9 ; âLü[â{ü[âhâXâeü[â^âX
GIO_REGS equ $AA ; æììçIOâîâWâXâ^
PPI_REGS equ $AB ; PPIâîâWâXâ^
PSG_REGS equ $A0 ; PSGâîâWâXâ^ö╘ìå
PSG_DATA equ $A1 ; PSGâfü[â^
PSG_STAT equ $A2 ; PSGâXâeü[â^âX
MAP_REG1 equ $FC ; RAMâ}âbâpü[ 0000h-3FFFh
MAP_REG2 equ $FD ; RAMâ}âbâpü[ 4000h-7FFFh
MAP_REG3 equ $FE ; RAMâ}âbâpü[ 8000h-BFFFh
MAP_REG4 equ $FF ; RAMâ}âbâpü[ C000h-FFFFh
VDP_DATA equ $98 ; VDPâfü[â^Åæé½ì₧é▌
VDP_ADDR equ $99 ; VDPâAâhâîâX
VDP_PALT equ $9A ; VDPâpâîâbâgâëâbâ`
VDP_REGS equ $9B ; VDPâîâWâXâ^âAâNâZâX
H_KEYI equ $FD9A ; âLü[â{ü[âhèäéΦì₧é▌âtâbâN
H_TIMI equ $FD9F ; â^âCâ}ü[èäéΦì₧é▌âtâbâN
H_NMI equ $FDD6 ; NMIâtâbâN
H_STKE equ $FEDA ; âXâ^âbâNâGâëü[âtâbâN
STKTOP equ $F674
EXP_TBL equ $FCC1 ; âXâìâbâgÅεò±âeü[âuâï
SLT_TBL equ $FCC5 ; âXâìâbâgÅεò±
EXBRSA equ $FAF8 ; âTâuâìâÇê╩Æu
SSL_REGS equ $FFFF ; ègÆúâXâìâbâgæIæ≡âîâWâXâ^
;----------------------------------------------
; âÅü[âNâGâèâA
GRPNAM equ $F3C7 ; Screen2 Name
GRPCOL equ $F3C9 ; Screen2 Color
GRPCGP equ $F3CB ; Screen2 CG pattern
GRPATR equ $F3CD ; Screen2 Attribute
GRPPAT equ $F3CF ; Screen2 Sprite pattern
TXTNAM equ $F3B3
TXTCOL equ $F3B5
TXTCGP equ $F3B7
TXTATR equ $F3B9
TXTPAT equ $F3BB
T32NAM equ $F3BD
T32COL equ $F3BF
T32CGP equ $F3C1
T32ATR equ $F3C3
T32PAT equ $F3C5
NAMBAS equ $F922
CGPBAS equ $F924
PATBAS equ $F926
ATRBAS equ $F928
MLTNAM equ $F3D2 ; Screen3 Name
MLTCOL equ $F3D4 ; Screen3 Color
MLTCGP equ $F3D6 ; Screen3 CG pattern
MLTATR equ $F3D8 ; Screen3 Attribute
MLTPAT equ $F3DA ; Screen3 Sprite pattern
CLIKSW equ $F3DB ; Key Click.
STATFL equ $F3E7
RG0SAV equ $F3DF
RG1SAV equ $F3E0
RG4SAV equ $F3E3
RG8SAV equ $FFE7
CLIKFL equ $FBD9
OLDKEY equ $FBDA
NEWKEY equ $FBE5
KEYBUF equ $FBF0
PUTPNT equ $F3F8 ; âLü[âoâbâtâ@é╓é╠â|âCâôâ^
GETPNT equ $F3FA ; âLü[âoâbâtâ@é╓é╠â|âCâôâ^
LIMPNT equ $FC17 ; âLü[âoâbâtâ@é╓é╠â|âCâôâ^
BOTTOM equ $FC48
HIMEM equ $FC4A
JIFFY equ $FC9E ; â^âCâ}ü[âJâEâôâ^
SCRMOD equ $FCAF
FORCLR equ $F3E9
BAKCLR equ $F3EA
BDRCLR equ $F3EB
PSG_DBG equ $F3EC ; âfâoâbâOùpâtâëâO
CSRY equ $F3DC ; âJü[â\ü[âïê╩Æu(Yì└òW)
CSRX equ $F3DD ; âJü[â\ü[âïê╩Æu(Xì└òW)
LINL40 equ $F3AE
LINL32 equ $F3AF
LINLEN equ $F3B0 ; ìsÉö.
CRTCNT equ $F3B1 ; ëµû╩é╠îàÉö
LINWRK equ $FC18 ; 40îàò¬é╠âoâbâtâ@
ESCCNT equ $FCA7 ; ESCùpâJâEâôâ^.
;-----------------
; âfâoâbâOâïü[â`âôùpâüâéâè
;-----------------
DISPADDR equ $E010 ; â_âôâvâAâhâîâXùpâüâéâè
LASTSTAC equ $E000
SP_REGS equ $E002
;---------------------
; âWâââôâvâeü[âuâï
;---------------------
;start
Start
code
;0000h CHKRAM
chkram
org $0000
di
jp soft_reset
;âtâHâôâgé╓é╠â|âCâôâ^
org $0004
dw B_Font
org $0006
rdvdpa db VDP_DATA ; VDPô╟é▌Åoé╡â|ü[âg
wrvdpa db VDP_DATA ; VDPÅæé½ì₧é▌â|ü[âg
;0008h SYNCHR
synchr
org $0008
ret
;000Ch RDSLT öCê╙âXâìâbâgé⌐éτé╠âüâéâèô╟é▌ì₧é▌
org $000c
jp rdslt
chrgtb
org $0010
ret
;0014h WRSLT öCê╙âXâìâbâgé╓é╠âüâéâèÅæé½ì₧é▌
org $0014
jp wrslt
ret
;0018h OUTDO
org $0018
jp ch_put
;001Ch CALSLT âCâôâ^ü[âXâìâbâgâRü[âïâïü[â`âô
calslt
org $001c
jp cal_slt
ret
;0020h DCOMPR HLé╞DEé╠öΣèr
dcompr org $0020
jp wordcomp
ret
;0024h ENASLT âXâìâbâgé╠ò╧ìX
org $0024
jp enaslt
;0028h MATH-PACK
org $0028
ret
;002D âoü[âWâçâôIDôÖ
romid
org $002d
; version ID
db 0 ; 0 .. msx1 ,1 .. msx2
db 0 ; ??
db 0 ; ??
;0030h CALLF âCâôâ^ü[âXâìâbâgî─é╤Åoé╡(RST30hö┼)
org $0030
jp call_lf
;0038h INT_38 èäéΦì₧é▌âïü[â`âô(RST38,VBlank,Timer...)
org $0038
jp int_start
;0038h INITIO I/Oé╠Åëè·ë╗
org $003b
ret
;0041h DISSCR âXâNâèü[âôé≡ò\Īé│é╣é╚éóüB
org $0041
jp disscr
;0044h ENASCR âXâNâèü[âôé≡ò\Īé│é╣éΘüB
org $0044
jp enascr
;---------------
;VDPâïü[â`âô
;---------------
;0047h WRTVDP
org $0047
jp wrt_vdp
;004Ah RDVRM
org $004a
jp rd_vrm
;004Dh WRTVRM
org $004d
jp wrt_vrm
;0050h SETRD
org $0050
jp vdp_setrd
;0053h SETWRT .. VRAMÅæé½ì₧é▌âAâhâîâXé╠É▌ÆΦ
org $0053
jp vdp_setwrt
org $0056
jp vdp_fillmem
org $0059
jp vdp_ldirmv ; VRAM -> Memory
org $005C
jp vdp_data_rep ; Memory -> VRAM
;005Fh VDPâXâNâèü[âôâéü[âhé╠ò╧ìX
org $005f
jp chgmod
;0062h CHGCLR
org $0062
jp chgclr
;0066h INT_NMI .. NMIèäéΦì₧é▌
org $0066
jp nmi_int
;0069h CLRSPR .. âXâvâëâCâgé≡Å┴ïÄüB
org $0069
ret
;006Ch INITXT ëµû╩é≡TEXT1âéü[âhé╔Åëè·ë╗üB
org $006C
jp init_txt
;006Fh INIT32 ëµû╩é≡GRAPHIC1âéü[âhé╔Åëè·ë╗üB
org $006F
jp init_txt32
;0072h INITGRP ëµû╩é≡GRAPHIC2âéü[âhé╔Åëè·ë╗üB
org $0072
jp init_grp
;007Eh SETGRP
org $007E
jp set_grp
;0085h DOLINE âëâCâôò`ëµ
doline
org $0085
ret
;0089h GRPPRT basic?
grpprt
org $0089
ret
org $008a
ret
;
;0090h GICINI ë╣î╣ICé╠Åëè·ë╗
org $0090
jp sound_init
org $0093
jp sound_out
org $0096
jp sound_stat
;009Ch CHSNS .. âLü[âoâbâtâ@é╠â`âFâbâN
org $009c
jp ch_sns
;009Fh CHGET .. âLü[âoâbâtâ@é⌐éτâfü[â^é≡ô╛éΘ
org $009f
jp ch_get
;00A2h CHPUT .. âfâBâXâvâîâCé╠âLâââëâNâ^é≡Åoù═é╖éΘüB
org $00a2
jp ch_put
;00C6h POSIT .. âJü[â\âïê┌ô«üB
org $00c6
jp curxy
;00D5h GTSTCK .. âWâçâCâXâeâBâbâNÅεò±é≡ô╛éΘüB
org $00d5
jp in_joy
;00D8h GTTRIG .. âgâèâKü[Åεò±é≡ô╛éΘüB
org $00d8
jp in_trig
;012Dh WRTVDP .. VDPâîâWâXâ^é╠Ælé≡ò╧ìXé╖éΘ
org $012d
ret
;0131h VDPSTA .. VDPâXâeü[â^âXé≡ô╟é▌Åoé╖
;vdpsta
org $0131
ret
;chgsnd
org $0135
ret
;0138h RDSLTREG âvâëâCâ}âèâXâìâbâgé╠Åεò±é≡ô╟é▌Åoé╖
;g_slotreg
org $0138
jp get_slotreg
;013Bh WRSLTREG âvâëâCâ}âèâXâìâbâgé╔Åεò±é≡Åæé½ì₧é▐üB
;s_slotreg
org $013B
jp set_slotreg
;013Eh RDVDP VDPâXâeü[â^âXé╠ô╟é▌Åoé╡
org $013E
jp vdp_stat_in
;setpag org $013d
; ret
;0141h SNSMAT âLü[â}âgâèâNâXé≡ô╛éΘ
;snsmat
org $0141
jp in_keyboard
;phydio
org $0144
ret
;0145h RSTPLT
;rstplt
org $0145
ret
;0149h RSTPLT?
;rstplt
org $0149
ret
;getplt
org $014d
ret
;0156h KILBUF âLü[â{ü[âhâoâbâtâ@é≡âNâèâAé╖éΘ
org $0156
jp kilbuf
;0159h CALBAS âxü[âVâbâNâCâôâ^âvâèâ^é≡î─é╤Åoé╖üB
org $0159
jp call_basic_intr
;beep
org $017d
ret
;prompt
org $0181
ret
;newpad
org $01ad
ret
;chgmdp
org $01b5
ret
;knjprt
org $01bd
ret
;redclk
org $01f5
ret
;wrtclk
org $01f9
ret
; -------------------
; âXâ^ü[âgâAâbâvâRü[âhüiâèâZâbâgÄ₧é╔î─é╤Åoé│éΩéΘüj
; -------------------
org $0200
soft_reset
;âfâoâbâOùp
; ex (sp),hl
; ld (LASTSTAC),hl
;
; ld hl,$0000
; add hl,sp
; ld (SP_REGS),hl
;
; ld hl,$f300
; âCâôâ^ü[âtâFü[âXé≡Åëè·ë╗é╖éΘüB
ld a,$82
out (PPI_REGS),a
ld a,$50
out (GIO_REGS),a
;âüâéâèâoâôâNé≡Åëè·ë╗é╖éΘüB
xor a,a
; out (MAP_REG1),a
inc a
out (MAP_REG2),a
inc a
out (MAP_REG3),a
inc a
out (MAP_REG4),a
;âüâéâèâ`âFâbâNüAæIæ≡âXâìâbâgé≡âüâéâèé╔Åæé½ì₧é▐üB
; C = âvâëâCâ}âè,B = âZâJâôâ_âèüB
ld bc,$0303
chk_wrt_ram ; âyü[âWéRé╠RAMé≡â`âFâbâNé╖éΘüB
in a,(PSL_STAT)
and a,$3F
ld e,a
ld a,c
and a,$03
rrca
rrca
or a,e
out (PSL_STAT),a ; A = BBxxxxxx
ld a,(SSL_REGS)
cpl
and a,$3F
ld e,a
ld a,b
and a,$03
rrca
rrca
or a,e
ld (SSL_REGS),a ; A = EExxxxxx
ld e,a
ld a,$12
ld ($c010),a
ld a,($c010)
cp a,$12
jr nz,cant_wrt
jp ram_ok
cant_wrt
dec b
jp p,chk_wrt_ram
ld b,$03
dec c
jp p,chk_wrt_ram
ld de,str_memory_err
jp print_error
ram_ok
ld hl,SLT_TBL
ld b,0
ld c,a
add hl,bc
ld a,e
ld (hl),a ;ègÆúâXâìâbâg
and a,$0C
in a,(PSL_STAT)
and a,$03
or a,$80
ld (EXP_TBL),a ;MAIN-ROMé╠ê╩Æu
and a,$80
ld (EXP_TBL+1),a
ld (EXP_TBL+2),a
ld (EXP_TBL+3),a
; you can write the memory.
;----------------------
;âåü[âUü[âCâôâ^ü[âtâFü[âX
;----------------------
ld hl,$f300
ld sp,hl ; âXâ^âbâNé≡$f300é╔üB
call init_ram
call check_rom
; in a,(PSL_STAT)
; ld ($F000),a
; call p3_chk
call init_vdp
xor a,a
ld (PSG_DBG),a
call sound_init
ei
call disp_info
call start_cartprog
;----------------------
;âJü[âgâèâbâWé≡Ä└ìsé╖éΘ
;----------------------
start_game
in a,(PSL_STAT)
rrca
rrca
and a,$03
cp a,$03
jr z,dont_chgscr
ld a,$01
call chgmod
dont_chgscr
ld hl,stack_error
push hl
ld a,($4000)
cp a,'A'
jr nz,p3_run
ld hl,($4002) ; âJü[âgâèâbâWèJÄnâAâhâîâXüB
jr prg_jumper
p3_run
ld hl,($8002) ; âJü[âgâèâbâWèJÄnâAâhâîâXüB
prg_jumper
jp (hl) ; Ä└ìs...
;-------------------------------
; Åεò±ò\Ī
;-------------------------------
disp_info
; âVâtâgâLü[é¬ëƒé│éΩé─éóéΩé╬debug_modeé╓üB
;
ld a,$06
call in_keyboard
bit 0,a
jp z,debug_mode
; âvâìâOâëâÇÅεò±é╠ò\Ī
ld hl,str_proginfo ; HL = ò╢ÄÜù±âAâhâîâX
call prn_text
ld a,($4000)
cp a,'A'
ret z
ld a,($8000)
cp a,'A'
ret z
ld hl,str_nocart
call prn_text
jp hang_up_mode
;----------------------------
start_cartprog
; âXâìâbâgÅπé╔âJü[âgâèâbâWé¬æ╢ì▌é╡é╜é╚éτüA
; é╗é╠âXâìâbâgé╠âvâìâOâëâÇé≡Ä└ìsé╖éΘüB
ld hl,str_slot
call prn_text
call get_slotreg
rrca
rrca
and a,$03
ld d,$00
ld e,a
push de
call vout_hex8
call vout_hyphen
pop de
ld hl,SLT_TBL
add hl,de
ld a,(hl)
rrca
rrca
and a,$03
call vout_hex8
;âfâoâbâOé╞ô«ì∞â`âFâbâN
; call check_sum
; ld a,(SMOD_TSTSND)
; or a,a
; jr z,stst_skip
;âTâEâôâhâéü[âhùp
; ld hl,str_canstst
; call prn_text
stst_skip
ld b,120 ; 2sec wait (1 = 1/60sec)
call wait_key07 ; wait routine
;âTâEâôâhâéü[âhùp
; bit 7,a
; call z,sound_mode
bit 5,a
jp z,sh_keyboard
bit 0,a
jp z,debug_mode
ld hl,str_crlf
call prn_text
ld hl,str_run
call prn_text
call dbg_reg
ld b,60 ; 1sec
call wait_b
ret
; ------
; BIOSâfâoâbâOâïü[â`âô
; ------
; HL ... NEWKEYé╠âAâhâîâX .
;
sh_keyboard
call init_vdp
kbd_lp
ld a,1
ld (CSRX),a
ld (CSRY),a
ld hl,NEWKEY
ld b,10
kbd_byteread
push bc
ld a,(hl)
inc hl
ld b,8
kbd_shift
rlca
push af
jr c,kbd_on
;Bit[n] = 0
ld a,'0'
call ch_put
pop af
jr kbd_lpchk
;Bit[n] = 1
kbd_on
ld a,'1'
call ch_put
pop af
kbd_lpchk
djnz kbd_shift
pop bc
ld a,$0d
call ch_put
ld a,$0a
call ch_put
djnz kbd_byteread
jp kbd_lp
sh_debug
ex (sp),hl
ld (LASTSTAC),hl
debug_mode
; âèâ^ü[âôâRü[âhé≡âtâbâNé╔ûäé▀ì₧é▐üB
ld a,$C9
ld (H_KEYI),a
ld (H_TIMI),a
call init_vdp
ld a,1
ld (CSRX),a
ld a,1
ld (CSRY),a
ld hl,$4000 ; âyü[âW1é⌐éτò\Īé╖éΘüB
ld (DISPADDR),hl
ld ix,(LASTSTAC)
call vout_hex16
ld a,' '
call ch_put
ld ix,(SP_REGS)
call vout_hex16
loop_dump
call disp_dump
call dump_keywait
jr loop_dump
;-----------------
; â_âôâvùpâïü[â`âô
;-----------------
disp_dump
ld a,1
ld (CSRX),a
ld a,3
ld (CSRY),a
ld ix,(DISPADDR)
ld c,$10 ; RegC = rows
dump_lp
push bc
call vout_hex16
pop bc
ld a,':'
call ch_put
ld b,$10 ; RegB = cols
d16_lp
ld a,(ix)
push bc
call vout_hex8
pop bc
inc ix
djnz d16_lp
dec c
jr nz,dump_lp
ret
;-------------------------
; âLü[âïü[âvùpâEâFâCâg
dump_keywait
ld e,$02
ld a,($E008)
ld d,a
ld a,$08
call in_keyboard
cp a,d
jr z,dumpkey_loop
; case of A != E008
ld ($E008),a
ld e,$10 ;
dumpkey_loop
halt
ld a,($E008)
ld d,a
ld a,$08
call in_keyboard
dec e
jr z,skip_kchk
cp a,d
jr z,dumpkey_loop
skip_kchk
push af
ld a,$06
call in_keyboard
bit 0,a
jr nz,norm
ld iy,$1000
jr bit_chk
norm
ld iy,$100
bit_chk
pop af
bit 7,a
jr z,on_pagedown
bit 6,a
jr z,on_down
bit 5,a
jr z,on_up
bit 4,a
jr z,on_pageup
ld ($E008),a
ld a,$07
call in_keyboard
bit 1,a
jr z,on_start
jp dumpkey_loop
on_pagedown
push iy
pop bc
jr up_addr
on_pageup
push iy
pop bc
jr down_addr
on_down
ld bc,$10
jr up_addr
on_up
ld bc,$10
jr down_addr
up_addr
ld hl,($E010)
add hl,bc
ld ($E010),hl
ret
down_addr
ld hl,($E010)
and a
sbc hl,bc
ld ($E010),hl
ret
on_start
jp start_game
;--------------------
;VDPâïü[â`âôé╠Åëè·ë╗
;--------------------
init_vdp
in a,(VDP_STAT) ; âëâbâ`é╠Åëè·ë╗
ld bc,$0000 ; R#0
call wrt_vdp
ld bc,$7001 ; R#1
call wrt_vdp
ld bc,$0002 ; R#2
call wrt_vdp
ld bc,$8003 ; R#3
call wrt_vdp
ld bc,$0104 ; R#4
call wrt_vdp
call clr_text40
ld a ,$00
ld hl,$0800
ld bc,$0800
call vdp_fillmem
; for screen 1 color table
ld a ,$F5
ld hl,$2000
ld bc,$0020
call vdp_fillmem
; PatGenTbl
; 76543210 76543210
; 00000100 00000000
; 04h 00h
ld bc,$F507 ; R#7
call wrt_vdp
in a,(VDP_STAT) ;ü@âëâbâ`é╠Åëè·ë╗
ld hl,B_Font
ld de,$800
ld bc,$800
call vdp_data_rep
ret
;------------------------
; ëµû╩ò\Īé│éΩé─éóéΘâeâLâXâgé≡âNâèâAé╖éΘüB
clr_text40
xor a,a
ld bc,$0400
ld hl,(TXTNAM)
call vdp_fillmem
ld a,1
ld (CSRY),a
ld (CSRX),a
ret
clr_text32
xor a,a
ld bc,$0300
ld hl,(T32NAM)
call vdp_fillmem
ld a,1
ld (CSRY),a
ld (CSRX),a
ret
;------------------------
; RAMé╠Åëè·ë╗
init_ram
; âÅü[âNâGâèâAÅëè·ë╗üB
ld a,$00
ld hl,$F380
ld (hl),a
ld de,$F381
ld bc,$C7D
ldir
;âèâ^ü[âôâRü[âhûäé▀ì₧é▌
ld a,$C9 ; ret code
ld hl,H_KEYI
ld (hl),a
ld de,H_KEYI+1
ld bc,$024D
ldir
;âLü[â}âgâèâNâXé╠Åëè·ë╗üB
ld a,$FF
ld hl,OLDKEY
ld (hl),a
ld de,OLDKEY+1
ld bc,21
ldir
;âLü[âoâbâtâ@é╠Åëè·ë╗üB
ld a,$00
ld hl,KEYBUF
ld (hl),a
ld de,KEYBUF+1
ld bc,39
ldir
ld a,$00
ld hl,$FFE7 ; RG8SAV
ld (hl),a
ld de,$FFE7+1
ld bc,15
ldir
;âAâhâîâXâ|âCâôâ^é≡É▌ÆΦüB
ld hl,KEYBUF
ld (PUTPNT),hl
ld (GETPNT),hl
ld hl,$8000
ld (BOTTOM),hl ; âyü[âW1,2é═ROMüBâyü[âW3,4é═RAM.
ld hl,$F380
ld (HIMEM),hl ; Ägùpë┬ö\âüâéâèé╠Åπî└
ld (STKTOP),hl ; BASICâXâ^âbâNé╠ê╩Æu
ld hl,disk_intr
ld a,$C3
ld (H_STKE),a
ld (H_STKE+1),hl
;RDPRIMé≡RAMé╔ô]æùé╖éΘ.
ld hl,m_rdprim
ld de,$F380
ld bc,m_prim_end-m_rdprim
ldir
; screen 0 âeü[âuâïé╠Åëè·ë╗üB
ld hl,$0000
ld (TXTNAM),hl
ld hl,$0800
ld (TXTCGP),hl
; screen 1 âeü[âuâïé╠Åëè·ë╗üB
ld hl,$1800
ld (T32NAM),hl
ld hl,$2000
ld (T32COL),hl
ld hl,$0000
ld (T32CGP),hl
ld hl,$1B00
ld (T32ATR),hl
ld hl,$3800
ld (T32PAT),hl
; screen 2 âeü[âuâïé╠Åëè·ë╗
ld hl,$1800
ld (GRPNAM),hl
ld hl,$2000
ld (GRPCOL),hl
ld hl,$0000
ld (GRPCGP),hl
ld hl,$1B00
ld (GRPATR),hl
ld hl,$3800
ld (GRPPAT),hl
; screen 3 âeü[âuâïé╠Åëè·ë╗
ld hl,$0800
ld (MLTNAM),hl
ld hl,$0000
ld (MLTCGP),hl
ld hl,$1B00
ld (MLTATR),hl
ld hl,$3800
ld (MLTPAT),hl
; é╗é╠æ╝é╠É▌ÆΦüB
ld a,39
ld (LINL40),a
ld a,29
ld (LINL32),a
; ld a,29
ld a,39
ld (LINLEN),a
ld a,24
ld (CRTCNT),a
ld a,$04
ld (BDRCLR),a
ld (BAKCLR),a
ld a,$0F
ld (FORCLR),a
ld a,$20
ld (RG1SAV),a
ld a,$08
ld (RG8SAV),a
ret
;----------------------
;âTâuâìâÇê╩Æué╠îƒÅo
chksubpos
ld b,$03
ld hl,$0000
loop_subpos
ld a,b
push bc
call rdslt
pop bc
cp a,'C'
jr z,chked_c
slt_wrong
djnz loop_subpos
xor a,a
ld (EXBRSA),a
ret
chked_c
inc hl
ld a,b
push bc
call rdslt
pop bc
cp a,'D'
jr z,chked_d
dec hl
jr slt_wrong
chked_d
ld a,b
ld (EXBRSA),a
ret
;------------------------
;
;âîâWâXâ^é╠ò\Ī
;
dbg_reg
push ix
push iy
push hl
push de
push bc
push af
ld iy,6
ld a,1
ld (CSRX),a
ld a,14
ld (CSRY),a
dbg_loop
pop ix
call prn_hex
dec iy
push iy
pop bc
xor a,a
or a,c
jp nz,dbg_loop
pop ix
push ix
jp prn_hex ; âîâWâXâ^PCé╠ò\Ī
;------------------------
prn_hex
;BC = Reg
call prn_reg
call vout_hex16
ld a,' '
call ch_put
ret
;------------------------
prn_reg
;
push hl
push bc
push iy
pop bc
ld a,c
add a,a
add a,a
ld c,a
ld hl,reg_tbl
add hl,bc
ld b,3
reg_lp
ld a,(hl)
inc hl
call ch_put
djnz reg_lp
pop bc
pop hl
ret
;------------------------
vout_hex16
;16bitò¥é╠16ÉiÉöò\ĪüB
;IX = number
;dest = BC,HL,AF
; RegBÅπê╩4bit
ld hl,hex_tbl
push ix
pop bc
ld a,b
rlca
rlca
rlca
rlca
and a,$0F
ld b,0
ld c,a
add hl,bc
ld a,(hl)
call ch_put
; RegBë║ê╩4bit
ld hl,hex_tbl
push ix
pop bc
ld a,b
and a,$0F
ld b,0
ld c,a
add hl,bc
ld a,(hl)
call ch_put
; RegCÅπê╩4bit
ld hl,hex_tbl
push ix
pop bc
ld a,c
rlca
rlca
rlca
rlca
and a,$0F
ld b,0
ld c,a
add hl,bc
ld a,(hl)
call ch_put
; RegC ë║ê╩ 4bit
ld hl,hex_tbl
push ix
pop bc
ld a,c
and a,$0F
ld b,0
ld c,a
add hl,bc
ld a,(hl)
call ch_put
ret
;------------------------
vout_hex8
;8bitò¥é╠16ÉiÉöò\ĪüB
;A = ÉöÆl
;dest = BC,HL,AF
push af ; é▒é╠âXâ^âbâNé═ë║ê╩4bité╠é╜é▀é╔ÄgéñüB
; RegA Åπê╩ 4bit
ld hl,hex_tbl
rlca
rlca
rlca
rlca
and a,$0F
ld b,0
ld c,a
add hl,bc
ld a,(hl)
call ch_put
pop af
; RegA ë║ê╩ 4bit
ld hl,hex_tbl
and a,$0F
ld b,0
ld c,a
add hl,bc
ld a,(hl)
call ch_put
ret
;------------------------------
vout_hyphen
ld a,'-'
call ch_put
ret
;------------------------
; âEâFâCâgâïü[â`âô
;Æìê╙üAé▒é╠âïü[â`âôî─é╤Åoé╡é╠ì█é═Åφé╔EIé┼éáéΘé▒é╞üB
; B = âïü[âvë±Éö
wait_b
halt
djnz wait_b
ret
;------------------------
; âEâFâCâgâïü[â`âô
;Æìê╙üAé▒é╠âïü[â`âôî─é╤Åoé╡é╠ì█é═Åφé╔EIé┼éáéΘé▒é╞üB
; in .... B = âïü[âvë±Éö
; out ... A = âLü[â}âgâèâNâXé╠éVö╘û┌üB
; dest .. RegC
wait_key07
ld c,$ff
wk07_lp
halt
ld a,($FBEB)
and a,c
ld c,a
djnz wk07_lp
ld a,c
ret
;------------------------
;prn_text
; HL = ò╢ÄÜù±
prn_text
prn_str_disp
ld a,(hl)
or a,a
jp z,nul_term
call ch_put
inc hl
jr prn_str_disp
nul_term
ret
;-------------------------
check_sum
xor a,a
ld bc,$4000
ld hl,$4000
ld de,$0000
csum_lp
ld a,(hl)
add a,e
ld e,a
jr nc,csum_nc
inc d
csum_nc
inc hl
dec bc
ld a,b
or a,c
jr nz,csum_lp
ret
;---------------------------------------------
check_rom
ld b,$80
chk_rom_loop
ld h,$40
ld a,b
push bc
call enaslt
pop bc
ld a,($4000)
cp a,'A'
jr nz,chk_p3
ld a,($4003)
cp a,$40
jr c,chk_p3 ; A-$40 < 0
cp a,$80
jr nc,chk_p3 ; A-$80 >= 0
jp chk_rom_ok
;
chk_p3
ld h,$80
ld a,b
push bc
call enaslt
pop bc
ld a,($8003)
cp a,$80
jr c,no_cart ; A-$80 < 0
cp a,$C0
jr nc,no_cart ; A-$C0 >= 0
jp chk_rom_ok
;
no_cart
inc b
ld a,b
and a,$7f
cp a,$10
jr nz,chk_rom_loop
chk_rom_ng
ld h,$40
ld a,$80
push bc
call enaslt
pop bc
chk_rom_ok
ret
;----------------------------------
p3_chk
ld a,($8000)
cp a,'A'
jp z,page_set0
ret
page_set0
call get_slotreg
ld c,a
and a,$3F ; 00111111
ld b,a
and a,$03 ; 000000AA
rrca
rrca
or a,b ; AABBBBAA
out (PSL_STAT),a
ld a,(SSL_REGS)
cpl
and a,$F3 ; 11110011
ld d,a
and a,$03 ; 00000011
rlca
rlca
or a,d
ld (SSL_REGS),a
ld a,c
and a,$F3
ld c,a
and a,$03
rlca
rlca
or a,c
out (PSL_STAT),a
ret
;-------------------------------------
;âJü[â\âïé≡RegDEé╔ò╧è╖é╖éΘüB
;-------------------------------------
;out.. DE = VRAMâAâhâîâX
curs2de
push af
push bc
push hl
xor a
ld hl,SCRMOD
cp (hl)
jr nz,c2d_scr1
ld hl,(TXTNAM)
ld de,40 ; text40
jr c2d_do
c2d_scr1
ld hl,(T32NAM)
ld de,32 ; text32
; jr c2d_do
c2d_do
ld a,(CSRY)
cp a,2
jr c,c2d_add_skip
dec a
ld b,a
c2d_add_lp
add hl,de
djnz c2d_add_lp
c2d_add_skip
ld a,(CSRX)
cp a,2
jr c,c2d_add_skip2
dec a
ld e,a
add hl,de
c2d_add_skip2
ld de,hl
pop hl
pop bc
pop af
ret
;-----------------------------------
; RegDEé⌐éτâJü[â\âïê╩Æué╓ (CSRX,CSRY)
de2curs
push af
push bc
push de
push hl
ex de,hl
xor a
ld hl,SCRMOD
cp (hl)
jr nz,d2c_scr1
ld de,(TXTNAM)
ld bc,40
jr d2c_do
d2c_scr1
ld de,(T32NAM)
ld bc,32 ; text32
; jr d2c_do
d2c_do
inc a
ld c,a
jr under_chk
d2c_sub_lp
and a
sbc hl,bc
inc e
under_chk
xor a,a
cp a,h
jr nz,d2c_sub_lp
ld a,l
cp a,40
jr nc,d2c_sub_lp
ld a,e
inc a
ld (CSRY),a
ld a,l
inc a
ld (CSRX),a
pop hl
pop de
pop bc
pop af
ret
;----------------------------------
m_rdprim
out (PSL_STAT),a
ld e,(hl)
jr m_wrprm1
m_wrprim
out (PSL_STAT),a
ld (hl),e
m_wrprm1
ld a,d
out (PSL_STAT),a
ret
m_clprim
out (PSL_STAT),a
ex af,af'
call cl_jp
ex af,af'
pop af
out (PSL_STAT),a
ex af,af'
ret
m_cl_jp
jp (ix)
m_prim_end
nop
rdprim equ $F380
wrprim equ rdprim+(m_wrprim-m_rdprim)
clprim equ rdprim+(m_clprim-m_rdprim)
cl_jp equ rdprim+(m_cl_jp-m_rdprim)
;---------------------------
; âTâuâïü[â`âô
;---------------------------
; 000Ch RDSLT
; in .. A = âXâìâbâgID , HL = âAâhâîâX
rdslt
push hl
push af
ld a,h
rlca
rlca
and a,$03 ; âAâhâîâXÅπê╩2bit
ld l,a ; L=âVâtâgâiâôâoü[
ld b,a
ld a,$03
call rdsft
cpl
ld e,a ; E= â}âXâN
ld a,l ; A=âVâtâgâiâôâoü[
ld b,a ; B=âVâtâgâiâôâoü[
pop af
and a,$03
call rdsft
ld b,a ; B=âVâtâgé╡é╜âXâìâbâgö╘ìå
in a,(PSL_STAT)
ld d,a ; D=æOé╠âvâëâCâ}âèâXâìâbâg
and a,e
or a,b ; âXâìâbâgé≡ò╧ìXé╖éΘ
pop hl
call rdprim
ld a,e
ret
rdsft
inc b
dec b
ret z
rdsft_lp
rlca
rlca
djnz rdsft_lp
ret
; 0014h WRSLT
; in .. A = âXâìâbâgID , HL = âAâhâîâX
wrslt
push hl
push af
ld a,h
rlca
rlca
and a,$03 ; âAâhâîâXÅπê╩ 2bit
ld l,a ; L=âVâtâgö╘ìå
ld b,a
ld a,$03
call rdsft
cpl
ld e,a ; E=â}âXâN
ld a,l ; A=âVâtâgâiâôâoü[
ld b,a ; B=âVâtâgâiâôâoü[
pop af
and a,$03
call rdsft
ld b,a ; B=âVâtâgé│éΩé╜âXâìâbâg
in a,(PSL_STAT)
ld d,a ; D=æOé╠âvâëâCâ}âèâXâìâbâg
and a,e
or a,b ; âXâìâbâgé≡ò╧ìXé╖éΘ
pop hl
call wrprim
ret
;-------------------------------------
; 001Ch CALSLT(ÄbÆΦôIé╚è╓Éö)
; in .. IYh(âXâìâbâgö╘ìå),(IX)
cal_slt
jp (ix)
;--------------------------------
; 0020h DCOMPRü@16ârâbâgöΣèr
; in .. hl,de= ÉöÆl
wordcomp
ld a,h
cp a,d
ret nz
ld a,l
cp a,e
ret
;--------------------------------
; 0024h ENASLT
; in .. hl=âAâhâîâX,a=âXâìâbâgö╘ìå
; A = FxxxEESS
; RegA Å┌ì╫
; F = ègÆúâXâìâbâgé╠âtâëâO
; E = ègÆúâXâìâbâgö╘ìå
; S = âXâìâbâgö╘ìå
; Dest. AF,BC,DE,DI
enaslt
; A=(A >> 6)&0x3
di
push hl
ld l,a ; L = FxxxEEPP
and a,$03 ; A = 000000PP
ld b,a
ld a,$AB
psl_dup_lp
add a,$55
dec b
jp p,psl_dup_lp
ld d,a ; D = PP PP PP PP
ld a,h
rlca
rlca
and a,$03
ld h,a ; H = âAâhâîâXÅπê╩ 2bit
ld b,a
ld a,$C0
page_msk_lp
rlca
rlca
dec b
jp p,page_msk_lp
ld e,a ; E = 00 00 11 00(âyü[âWâ}âXâN)
cpl
ld c,a ; C = 11 11 00 11(AND MASK)
ld a,d
and a,e
ld b,a ; B = 00 00 PP 00
ld a,l
and a,a
jp p,chg_psl
;SSL-Change
rrca
rrca
and a,$03 ; A = 000000SS
push hl
push bc
ld b,a
ld a,$AB
ssl_dup_lp
add a,$55
dec b
jp p,ssl_dup_lp
and a,e
ld b,a ; B = 00 00 SS 00
ld a,d
and a,$C0
ld h,a
in a,(PSL_STAT)
ld l,a
and a,$C0
or a,h
out (PSL_STAT),a
ld a,(SSL_REGS)
cpl
and a,c
or a,b ; A = xx xx SS xx ( x = æOé╠Æl )
ld c,a
ld (SSL_REGS),a
ld a,l
out (PSL_STAT),a
; (SLTTBL + PP) <- RegC
ld hl,SLT_TBL
ld a,d
and a,$03 ; A = 000000PP
add a,l
ld l,a ; L = L + A
ld a,h
adc a,0
ld h,a ; H = H + Cy
ld a,c
ld (hl),a
pop bc
pop hl
chg_psl
in a,(PSL_STAT)
and a,c
or a,b
out (PSL_STAT),a
pop hl
ret
;--------------------------------
; 0030h CALLLF
call_lf
pop hl ; âXâìâbâgÅεò±é╠âAâhâîâX
ld a,(hl)
inc hl
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ex de,hl
push de
push hl
push af
call enaslt
pop af
pop hl
jp (hl)
;--------------------------------
; 0050h SETRD
vdp_setrd
di
ld a,l
out (VDP_ADDR),a
ld a,h
and a,$3f
out (VDP_ADDR),a
ei
ret
;--------------------------------
; 0053h SETWRT
; VRAMâAâhâîâXé╠É▌ÆΦ
vdp_setwrt
di
ld a,l
out (VDP_ADDR),a
ld a,h
and a,$3f
or a,$40
out (VDP_ADDR),a
ei
ret
;--------------------------------
;0056h fill VRAM
;HL = VRAM âAâhâîâX, BC = Æ╖é│ , A = âfü[â^
vdp_fillmem
push af
call vdp_setwrt
lp_u001
pop af
out (VDP_DATA),a
push af
dec bc
ld a,c
or b
jr nz,lp_u001
pop af
ret
;--------------------------------
wrt_vdp
; 0047h WRTVDP
;in:B = VDP âfü[â^ , C = âîâWâXâ^ö╘ìå
; dest af,b
push hl
di
ld a,b
out (VDP_ADDR),a
ld a,c
or a,$80
out (VDP_ADDR),a
ei
ld a,c
and a,$3F
sub a,8
jr nc,rg8_sav
ld a,b
ld b,0
ld hl,RG0SAV
add hl,bc
ld (hl),a
pop hl
ret
rg8_sav
push bc
ld c,a
ld a,b
ld b,0
ld hl,RG8SAV
add hl,bc
ld (hl),a
pop bc
pop hl
ret
;--------------------------------
;004Ah VRAMô╟é▌Åoé╡
rd_vrm
call vdp_setrd
ex (sp),ix
ex (sp),ix
in a,(VDP_DATA)
ret
;--------------------------------
;004Dh VRAMÅæé½ì₧é▌
wrt_vrm
push af
call vdp_setwrt
ex (sp),ix
ex (sp),ix
pop af
out (VDP_DATA),a
ret
;--------------------------------
;in de bc
;dest. af de bc
vdp_ldirmv
call vdp_setrd
ex (sp),ix
ex (sp),ix
ldir_lp1
in a,(VDP_DATA)
ld (de),a
inc de
dec bc
ld a,c
or b
jr nz,ldir_lp1
ret
;--------------------------------
vdp_reg1chk
ld a,(RG1SAV)
rrca
rrca
ld a,$08
ret nc
ld a,$20
ret
;--------------------------------
;in hl de bc
;dest. af de bc
vdp_data_rep
ex de,hl
call vdp_setwrt
lp_vd_rep
ld a,(de)
out (VDP_DATA),a
inc de
dec bc
ld a,c
or b
jr nz,lp_vd_rep
ret
;------------------------------
;screen 5é╠Åëè·ë╗.
init_sc5
ld a,$05
ld (SCRMOD),a
in a,(VDP_STAT) ; âëâbâ`âèâZâbâg
call chgclr
ld a,(RG0SAV)
and a,$F1 ; MASK 11110001
or a,$06 ; M4,M3 = 1
ld b,a ; B = R#0 data
ld c,0
call wrt_vdp ; VDP R#0
ld a,(RG0SAV+1)
and a,$E7 ; MASK 11100111
ld b,a ; B = R#1 data
inc c
call wrt_vdp ; VDP R#1
ld hl,$0000
ld (NAMBAS),hl
ld (CGPBAS),hl
ld hl,$7600
ld (ATRBAS),hl
ld hl,$7800
ld (PATBAS),hl
ld b,$1F ; B = data
ld c,2
call wrt_vdp ; VDP R#2
ld a,(RG0SAV+3)
ld b,a ; B = data
ld c,3
call wrt_vdp ; VDP R#3
ld a,(RG0SAV+4)
ld b,a ; B = data
ld c,4
call wrt_vdp ; VDP R#4
ld b,$ef ; B = data
ld c,5
call wrt_vdp ; VDP R#5
ld b,$0f ; B = data
inc c
call wrt_vdp ; VDP R#6
ld b,$08 ; B = data
ld c,8
call wrt_vdp ; VDP R#8
ld b,$80 ; B = data
ld c,9
call wrt_vdp ; VDP R#9
ld b,0 ; B = data
ld c,10
call wrt_vdp ; VDP R#10
ld b,0 ; B = data
inc c
call wrt_vdp ; VDP R#11
ld b,0 ; B = data
inc c
call wrt_vdp ; VDP R#12
ld b,0 ; B = data
inc c
call wrt_vdp ; VDP R#13
ld b,1 ; B = data
inc c
call wrt_vdp ; VDP R#14
ld b,0 ; B = data
inc c
call wrt_vdp ; VDP R#15
ld b,$0F ; B = data
inc c
call wrt_vdp ; VDP R#16
ld b,$2C ; B = data
inc c
call wrt_vdp ; VDP R#17
ld b,$00 ; B = data
inc c
call wrt_vdp ; VDP R#18
ld b,$00 ; B = data
inc c
call wrt_vdp ; VDP R#19
ld b,$00 ; B = data
inc c
call wrt_vdp ; VDP R#20
ld b,$3B ; B = data
inc c
call wrt_vdp ; VDP R#21
ld b,$05 ; B = data
inc c
call wrt_vdp ; VDP R#22
call enascr
ret
;------------------------------
;VDPé≡âXâNâèü[âô7é┼Åëè·ë╗é╖éΘüB
init_sc7
ld a,$07
ld (SCRMOD),a
in a,(VDP_STAT) ; âëâbâ`é╠âèâZâbâg
call chgclr
ld a,(RG0SAV)
and a,$F1 ; MASK 11110001
or a,$0A ; M4,M3 = 1
ld b,a ; B = R#0 data
ld c,0
call wrt_vdp ; VDP R#0
ld a,(RG0SAV+1)
and a,$E7 ; MASK 11100111
ld b,a ; B = R#1 data
inc c
call wrt_vdp ; VDP R#1
ld hl,$0000
ld (NAMBAS),hl
ld (CGPBAS),hl
ld hl,$7600
ld (ATRBAS),hl
ld hl,$7800
ld (PATBAS),hl
ld b,$1F ; B = data
ld c,2
call wrt_vdp ; write VDP R#2
ld a,(RG0SAV+4)
ld b,a ; B = data
ld c,4
call wrt_vdp ; write VDP R#4
ld a,(RG0SAV+3)
ld b,a ; B = data
ld c,3
call wrt_vdp ; write VDP R#3
ld b,0 ; B = data
ld c,10
call wrt_vdp ; write VDP R#10
ld b,0 ; B = data
inc c
call wrt_vdp ; write VDP R#11
ld b,0 ; B = data
inc c
call wrt_vdp ; write VDP R#12
ld b,$00 ; B = data
ld c,19
call wrt_vdp ; write VDP R#19
ld b,$01 ; B = data
ld c,15
call wrt_vdp ; write VDP R#15
in a,(VDP_STAT) ; reset Latch
ld b,$00 ; B = data
ld c,15
call wrt_vdp ; write VDP R#15
ld b,$ef ; B = data
ld c,5
call wrt_vdp ; write VDP R#5
ld b,$0f ; B = data
inc c
call wrt_vdp ; write VDP R#6
call enascr
ret
;--------------------------------
;0072h INIGRP
init_grp
ld a,$02
ld (SCRMOD),a
in a,(VDP_STAT) ; reset Latch
call chgclr
ld a,(RG0SAV)
and a,$F1 ; MASK 11110001
or a,2 ; M3 = 1
ld b,a ; B = R#0 data
ld c,0
call wrt_vdp ; write VDP R#0
ld a,(RG1SAV)
and a,$E7 ; MASK 11100111
ld b,a ; B = R#1 data
inc c
call wrt_vdp ; write VDP R#1
ld hl,(GRPNAM)
call vdp_setwrt
ld b,3
xor a,a
ig_loop
out (VDP_DATA),a
inc a
jr nz,ig_loop
djnz ig_loop
ld hl,(GRPATR)
ld (ATRBAS),hl
ld hl,(GRPPAT)
ld (PATBAS),hl
ld hl,GRPNAM
ld de,$7F03
call set_grp
call enascr
ret
; HL = âeü[âuâïâAâhâîâX
; B = DATA , C = VDP R#
; DE = VDPDATA
set_grp
push ix
ld ix,shift_tbl
ld c,2 ; C = VDP R#
xor a,a ; data=0
call adr_sft ; R#2
ld a,d ; data=D
call adr_sft ; R#3
ld a,e ; data=E
call adr_sft ; R#4
xor a,a ; data=0
call adr_sft ; R#5
xor a,a ; data=0
call adr_sft
pop ix
ret
shift_tbl
db $06,$0A,$05,$09,$05
;
;HL = âeü[âuâïâAâhâîâX
;
adr_sft
push hl
push af
ld b,(ix)
inc ix
; HL <- (HL)
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
sft_lp
add hl,hl
adc a,a
djnz sft_lp
ld h,a ; H = âVâtâgé╡é╜HLé╠Åπê╩üB
pop af
or a,h
ld b,a
call wrt_vdp
pop hl
inc hl
inc hl
inc c
ret
;----------------------------------
;005Fh CHGMOD ëµû╩âéü[âhé╠ò╧ìX
chgmod
or a,a
jp z,init_txt ; screen 0
dec a
jp z,init_txt32 ; screen 1
dec a
jp z,init_grp ; screen 2
dec a
;
; jp z,init_mlt ; screen 3
;
dec a
;
; jp z,init_sc4 ; screen 4
;
dec a
jp z,init_sc5 ; screen 5
dec a
; jp z,init_sc6 ; screen 6
dec a
jp z,init_sc7 ; screen 7
ret
;--------------------------------
;006Ch INITXT
init_txt
ld a,$00
ld (SCRMOD),a
call clr_text40
in a,(VDP_STAT) ; reset Latch
call chgclr
ld a,(RG0SAV)
and a,$F1 ; MASK 11110001
ld b,a ; B = R#0 data
ld c,0
call wrt_vdp ; write VDP R#0
ld a,(RG1SAV)
and a,$E7 ; MASK 11100111
or a,$10
ld b,a ; B = R#1 data
inc c
call wrt_vdp ; write VDP R#1
ld bc,$0104 ; R#4 PatGenTBLaddr=$0800
call wrt_vdp ; write VDP R#4
ld bc,$0002 ; R#2 PatNamTBLaddr=$0000
call wrt_vdp ; write VDP R#2
in a,(VDP_STAT) ; reset Latch
ld hl,B_Font
ld de,(TXTCGP)
ld bc,$800
call vdp_data_rep ; init Font
ld hl,$0000
ld (NAMBAS),hl
ld hl,$0800
ld (CGPBAS),hl
ld a,39
ld (LINLEN),a
ret
;--------------------------------
;006Fh INIT32
init_txt32
; screen 1
ld a,$01
ld (SCRMOD),a
call clr_text32
call chgclr
ld a,(RG0SAV)
and a,$F1 ; MASK 11110001
ld b,a ; B = R#0 data
ld c,0
call wrt_vdp ; write VDP R#0
ld a,(RG1SAV)
and a,$E7 ; MASK 11100111
ld b,a ; B = R#1 data
inc c
call wrt_vdp ; write VDP R#1
ld hl,(T32NAM)
ld (NAMBAS),hl
ld hl,(T32CGP)
ld (CGPBAS),hl
ld hl,(T32PAT)
ld (PATBAS),hl
ld hl,(T32ATR)
ld (ATRBAS),hl
ld hl,(T32NAM)
ld a,h
rrca
rrca
and a,$3F
ld b,a
ld c,2
call wrt_vdp ; write VDP R#2
ld hl,(T32COL)
ld b,2
tcol_lp
xor a,a
rl l
rl h
djnz tcol_lp
ld a,h
ld b,a
ld c,3
call wrt_vdp ; write VDP R#3
ld hl,(T32CGP)
ld a,h
rrca
rrca
rrca
and a,$1F
ld b,a
ld c,4
call wrt_vdp ; write VDP R#4
ld hl,(T32ATR)
rl l
rl h
ld a,h
ld b,a
ld c,5
call wrt_vdp ; write VDP R#5
ld hl,(T32PAT)
ld a,h
rrca
rrca
rrca
and a,$1F
ld b,a
ld c,6
call wrt_vdp ; write VDP R#6
in a,(VDP_STAT) ; reset Latch
ld hl,B_Font
ld de,(T32CGP)
ld bc,$800
call vdp_data_rep ; init Font
; ld a,1
; ld (CSRY),a
; ld (CSRX),a
ld a,29
ld (LINLEN),a
ret
;0062h CHGCLR
;in = û│é╡
chgclr
ld a,(SCRMOD)
dec a
push af
ld a,(FORCLR)
rlca
rlca
rlca
rlca
ld l,a
ld a,(BDRCLR)
or a,l
ld b,a
ld c,7
call wrt_vdp
pop af
ret nz
ld a,(FORCLR)
rlca
rlca
rlca
rlca
and a,$F0
ld hl,BAKCLR
or a,(hl)
ld hl,(T32COL)
ld bc,$0020
push af
call vdp_setwrt
cclr_lp pop af
out (VDP_DATA),a
push af
dec bc
ld a,b
or c
jr nz,cclr_lp
pop af
ret
;0044h ENASCR
enascr
in a,(VDP_STAT) ; reset Latch
ld a,(RG1SAV)
or a,$40
ld b,a
ld c,1
call wrt_vdp
ret
;00?? DISSCR
disscr
in a,(VDP_STAT) ; reset Latch
ld a,(RG1SAV)
and a,$BF
ld b,a
ld c,1
call wrt_vdp
ret
;--------------------------------
;009Ch CHSNS
ch_sns
push hl
push de
ld hl,(GETPNT)
ld de,(PUTPNT)
call wordcomp
jr z,no_chr
ld a,(hl)
and a,a
pop de
pop hl
ret
no_chr
xor a,a
and a,a
pop de
pop hl
ret
;---------------------------------
;009Fh CHGET
ch_get
ld a,$00
push hl
push de
push bc
loop_chget
ld hl,(GETPNT)
ld de,(PUTPNT)
call wordcomp
jr nz,get_ch
ei
halt
jr loop_chget
get_ch
ld hl,(PUTPNT)
ld bc,(GETPNT)
ld a,(bc)
and a,a
push af
ld bc,39
ld hl,(GETPNT)
inc hl
ld de,(GETPNT)
ldir
ld de,(PUTPNT)
dec de
ld (PUTPNT),de
pop af
pop bc
pop de
pop hl
ret
;-----------------------------------
;00A2h CHPUT
;in ... A = âLâââëâNâ^âRü[âh
ch_put
push de
push af
ld a,(SCRMOD)
ld e,a
ld a,1
cp a,e
jr nc,scr_txt_mode
pop af
pop de
ret
scr_txt_mode
pop af
push af
; CTRL code
cp a,$08
jp z,back_spc
cp a,$0d
jp z,ctrl_cr
cp a,$0a
jp z,ctrl_lf
; Charactor code
call set_curs
pop af
push af
out (VDP_DATA),a
ld a,(LINLEN)
ld e,a
ld a,(CSRX)
cp a,e
jr nc,chput_nx
; next point
inc a
chput_ret
ld (CSRX),a
pop af
pop de
ret
chput_nx
ld a,(CRTCNT)
ld e,a
ld a,(CSRY)
cp a,e
jr nc,chput_scrll
ld a,(CSRY)
inc a
ld (CSRY),a
ld a,1
jr chput_ret
chput_scrll
call scroll_txt
ld a,1
jr chput_ret
set_curs
call curs2de
ex de,hl
call vdp_setwrt
ex de,hl
ret
back_spc
ld a,(CSRX)
cp a,2
jr c,skip_bs
dec a
ld (CSRX),a
call set_curs
xor a,a
out (VDP_DATA),a
skip_bs
pop af
pop de
ret
; 0Dh CR
ctrl_cr
ld a,1
ld (CSRX),a
pop af
pop de
ret
; 0Ah LF âëâCâôâtâBü[âh
ctrl_lf
ld a,(CRTCNT)
ld e,a
ld a,(CSRY)
cp a,e
jr nc,lf_scroll
inc a
ld (CSRY),a
pop af
pop de
ret
lf_scroll
call scroll_txt
pop af
pop de
ret
; âXâNâìü[âïâïü[â`âô
scroll_txt
push af
push bc
push hl
push de
ld hl,(NAMBAS)
ld de,LINWRK
ld a,(CRTCNT)
; ld (CSRY),a
; dec a
ld b,a
ld a,(SCRMOD)
and a
jr nz,scroll_n0
ld c,40
jr scr_loop
scroll_n0
dec a
jr nz,scroll_n1
ld c,32
scr_loop
push bc
xor a
ld b,a
add hl,bc
push hl
push de
push bc
call vdp_ldirmv ; HL=VRAM,DE=RAM,BC=LENGTH
pop bc
pop de
pop hl
sbc hl,bc
ex de,hl ; DE = VRAM,HL = RAM
push hl
push de
push bc
call vdp_data_rep
pop bc
pop de
pop hl
ex de,hl ; DE = RAM,HL = VRAM
add hl,bc
pop bc
djnz scr_loop
ld a,0
call vdp_fillmem
scroll_n1
pop de
pop hl
pop bc
pop af
ret
;-----------------------
;00C6h âJü[â\âïé≡É▌ÆΦé╖éΘ
;in ... RegH = X, RegL = Y
curxy
ld a,h
ld (CSRY),a
ld a,l
ld (CSRX),a
ret
;-----------------------
;--------------------------------------
;0156h KILBUF âLü[âoâbâtâ@é≡âNâèâAüB
kilbuf
push de
push bc
push af
ld hl,KEYBUF
ld (PUTPNT),hl
ld a,$FF
ld hl,OLDKEY
ld (hl),a
ld de,OLDKEY+1
ld bc,21
ldir
pop af
pop bc
pop de
ret
;--------------------------------
;0090h GICINIT ë╣î╣ICÅëè·ë╗
sound_init
ld e,$00
ld a,$08
call sound_out
inc a
call sound_out
inc a
call sound_out
inc a
ld e,$b8
ld a,$07
call sound_out
ret
;--------------------------------
;0093h in a=reg#,e=data
sound_out
di
out (PSG_REGS),a
push af
ld a,e
out (PSG_DATA),a
ei
pop af
;âTâEâôâhâéü[âhùp
; push af
; push de
; ld d,a
; ld a,(PSG_DBG)
; or a,a
; call nz,disp_psg
; pop de
; pop af
ret
;--------------------------------
sound_stat
out (PSG_REGS),a
in a,(PSG_STAT)
ret
;--------------------------------
get_slotreg
in a,(PSL_STAT)
ret
;--------------------------------
set_slotreg
out (PSL_STAT),a
ret
;--------------------------------
; 013Eh
vdp_stat_in
in a,(VDP_STAT)
ret
;--------------------------------
;0141h SNSMAT
; in a = âLü[â{ü[âhâ}âgâèâNâXìsÉö
;dest AF,C,EI
in_keyboard
di
ld c,a
in a,(GIO_REGS)
and a,$F0
or a,c
out (GIO_REGS),a
in a,(KBD_STAT)
ei
ret
;--------------------------------
;00D5h GTSTCK
; a = InID...
; dest AF,BC,EI
in_joy
push bc
cp a,$00
jr nz,joy_stc1
ld a,$08
call in_keyboard
rrca
rrca
rrca
rrca
cpl
and a,$0f ; 0000RDUL
push hl
ld hl,joypos_kbd_tbl
ld b,0
ld c,a
add hl,bc
ld a,(hl)
pop hl
pop bc
and a,a
ret
joy_stc1
;PSG reg 15h
;0J001111
;PSG reg 14h
;00BARLDU
push hl
push de
ld e,0
dec a
jr z,sel_stc1
ld a,$40
ld e,a
sel_stc1
ld a,$0F
di
call sound_stat
ei
and a,$BF
or a,e
ld e,a
ld a,$0F
call sound_out
ld a,$0e
di
call sound_stat
ei
cpl
and a,$0f ; 0000RLDU
ld hl,joypos_joy_tbl
ld b,0
ld c,a
add hl,bc
ld a,(hl)
pop de
pop hl
pop bc
and a,a
ret
joy_end
ld a,$00
pop bc
and a,a
ret
joypos_joy_tbl
; 0 1 2 3 4 5 6 7
db $00,$01,$05,$00,$07,$08,$06,$00
; 8 9 A B C D E F
db $03,$02,$04,$00,$00,$00,$00,$00
joypos_kbd_tbl
; 0 1 2 3 4 5 6 7
db $00,$07,$01,$08,$05,$06,$00,$00
; 8 9 A B C D E F
db $03,$00,$02,$00,$04,$00,$00,$00
;--------------------------------
;00D8h GTTRIG
;dest AF,BC,EI
;
in_trig
cp a,$00
jr z,kbd_spc
jr joy_trig
kbd_spc
ld a,$08
call in_keyboard
and a,$01
jr z,spc_on
jr spc_off
spc_on
ld a,$FF
ret
spc_off
xor a,a
ret
joy_trig
di
dec a
push de
ld e,$00
ld b,a
and a,$01
jr z,sel_trig1
ld e,$40
sel_trig1
ld a,$0F
call sound_stat
and a,$BF
or a,e
ld e,a
ld a,$0F
call sound_out
ld a,b
ld b,$10
and a,$02
jr z,istrg_a
ld b,$20
istrg_a
ld a,$0e
di
call sound_stat
ei
pop de
and a,b
jr z,trig_on
jr trig_off
trig_on
ld a,$FF
ret
trig_off
xor a,a
ret
;------------------
; interrupt routine code
;------------------
int_start
;âfâoâbâOùp
; push hl
; ld hl,$3232
; ex (sp),hl
;
push hl
push de
push bc
push af
exx
ex af,af'
push hl
push de
push bc
push af
push iy
push ix
call H_KEYI
in a,(VDP_STAT)
or a,a
jp p,int_end
call H_TIMI
ld hl,(JIFFY)
inc hl
ld (JIFFY),hl
ei
ld (STATFL),a ; âXâeü[â^âXò█æ╢
xor a,a
ld (CLIKFL),a
call in_trig
cpl
and a,$01
ld ($F3E8),a
call old_key
call key_in
int_end
pop ix
pop iy
pop af
pop bc
pop de
pop hl
exx
ex af,af'
pop af
pop bc
pop de
pop hl
ei
ret
;--------------------------------
; 0066h NMIèäéΦì₧é▌
nmi_int
call H_NMI
retn
;--------------------------------
old_key
ld de,NEWKEY
ld hl,OLDKEY
ld b,$0b
oldkey_lp
ld a,(de)
ld (hl),a
inc de
inc hl
djnz oldkey_lp
ret
;--------------------------------
; âLü[â{ü[âhôⁿù═é≡âoâbâtâ@é╔ĵéΦì₧é▐
key_in
in a,(GIO_REGS)
and a,$F0
ld c,a
ld b,$0b
ld hl,NEWKEY
key_in_lp
ld a,c
out (GIO_REGS),a
in a,(KBD_STAT)
ld (hl),a
inc hl
inc c
djnz key_in_lp
call key_chk
ret
;--------------------------------
; âLü[âRü[âhâ`âFâbâNâïü[â`âô
; èäéΦì₧é▌é⌐éτî─é╤Åoé│éΩéΘüB
;
key_chk
ld ix,OLDKEY
ld de,NEWKEY
ld a,($FBEB)
rrca
jr nc,code_shift
ld hl,scode_tbl
jr scan_start
code_shift
ld hl,scode_tbl_shift
scan_start
ld b,$0b
key_chk_lp
ld a,(de)
cpl
and a,(ix)
ld c,$08
key_bit_lp
rrca
jr c,push_pnt
inc hl
dec c
jr nz,key_bit_lp
inc ix
inc de
djnz key_chk_lp
ret
push_pnt
push hl
push de
push bc
ld a,(hl)
and a,a
; RegAé¬ò\Īë┬ö\âLâââëâNâ^é┼é╚é»éΩé╬âXâgâbâNé╡é╚éóüB
jr z,pnt_flow
ld c,a
ld de,LIMPNT
ld hl,(PUTPNT)
call wordcomp
jr nc,pnt_flow
ld a,c
ld (hl),a
inc hl
ld (PUTPNT),hl
pnt_flow
pop bc
pop de
pop hl
ret
key_int
ld hl,NEWKEY
ld bc,$0006
add hl,bc
ld a,(hl)
and a,$01
jr nz,ki_end
call dbg_reg
ki_end
ret
;-------------------
org $1000
ld a,$82
out (PPI_REGS),a
ld a,$C9
ld (H_KEYI),a
ld (H_TIMI),a
ei
hang_up_mode
ld a,$06
call in_keyboard
bit 0,a
jp z,debug_mode
halt
jp hang_up_mode
org $1020
stack_error
call H_STKE
ld de,str_stack_error
jp print_error
;------------------------------------
;âxü[âVâbâNî─é╤Åoé╡
call_basic_intr
ld de,str_no_basic_intr
jp print_error
;------------------------------------
;âGâëü[ò\Ī
;in DE=âüâbâZü[âWé╠âAâhâîâXüB
print_error
in a,(VDP_STAT) ; reset Latch
ld hl,vdp_bios
ld b,$0C
ld c,VDP_ADDR
otir
ld bc,$0800
lp_clearmem
xor a,a
out (VDP_DATA),a
dec bc
ld a,b
or a,c
jr nz,lp_clearmem
ld hl,B_Font
ld bc,$800
lp_fontset
ld a,(hl)
out (VDP_DATA),a
inc hl
dec bc
ld a,b
or a,c
jr nz,lp_fontset
;set cursor to (0,0)
ld a,$00
out (VDP_ADDR),a
ld a,$40
out (VDP_ADDR),a
ld hl,str_error_prompt
ld a,(hl)
lp_errprn
out (VDP_DATA),a
inc hl
ld a,(hl)
and a,a
jr nz,lp_errprn
ld a,(de)
lp_strprn
out (VDP_DATA),a
inc de
ld a,(de)
and a,a
jr nz,lp_strprn
jp hang_up_mode
;------------------------------------
;âfâBâXâNâïü[â`âô
;------------------------------------
DISKIO equ $4010
disk_intr
ld hl,str_flist
call prn_text
xor a,a
ld bc,$01F9
ld de,$0000
ld hl,$C000
and a,a
call DISKIO
jp c,disk_error
ld hl,($C00B)
; âZâNâ^ü[âTâCâY / 0x20(âtâ@âCâïì\æóæ╠)
ld b,5
shift_adr
and a,a
rr h
rr l
djnz shift_adr
ld ($E100),hl
ld a,($C010)
ld b,a
ld hl,$0001
ld de,($C016)
dsk_lp
add hl,de
djnz dsk_lp
ex de,hl
xor a,a
ld bc,$01F9
ld hl,$C000
and a,a
call DISKIO
jp c,disk_error
ld ix,$C000
ld a,($E100)
ld c,a
file_lp
ld a,(ix)
and a,a
jp z,end_lp
ld b,8
name_lp
ld a,(ix)
inc ix
call ch_put
djnz name_lp
ld a,'.'
call ch_put
ld b,3
ext_lp
ld a,(ix)
inc ix
call ch_put
djnz ext_lp
ld de,$0015
add ix,de
ld hl,str_crlf
call prn_text
dec c
jr nz,file_lp
end_lp
jp hang_up_mode
; ld de,str_disk
; jp print_error
disk_error
push af
ld hl,str_diskerr
call prn_text
pop af
ld b,0
ld c,a
ld hl,str_de_addr
add hl,bc
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
call prn_text
jp hang_up_mode
;---------------------------------
;âVâXâeâÇâüâbâZü[âW
;---------------------------------
str_proginfo
; 0123456789012345678901234567890123456789
db "C-BIOS ver 0.17",$0d,$0a
db "Copyright (C) 2002-2003 BouKiCHi",$0d,$0a
db "Copyright (C) 2003 Reikan",$0d,$0a
db $00
str_slot
db $0d,$0a,"Slot:",$00
str_chksum
db $0d,$0a,"CheckSum:",$00
str_isgame
db " Game:",$00
;-------------------------------------
;âGâëü[âüâbâZü[âW
str_error_prompt
;
db "ERROR:",$00
str_memory_err
;
db "MEMORY NOT FOUND.",$00
str_no_basic_intr
;
db "CALLED NO EXISTANCE BASIC.",$00
str_disk
;
db "CALLED DISK ROUTINE.",$00
str_stack_error
;
db "STACK ERROR.",$00
str_crlf
db $0d,$0a,$00
str_flist
db $0d,$0a,"--- display disk file list ---",$0d,$0a,$00
str_diskerr
db "Disk Error:",$00
str_de_addr
dw str_de_wp
dw str_de_nr
dw str_de_de
dw str_de_se
dw str_de_rn
dw str_de_wf
dw str_de_oe
str_de_wp
db "Write protected",$0d,$0a,$00
str_de_nr
db "Not ready",$0d,$0a,$00
str_de_de
db "Data (CRC) error",$0d,$0a,$00
str_de_se
db "Seek error",$0d,$0a,$00
str_de_rn
db "Record not found",$0d,$0a,$00
str_de_wf
db "Write fault",$0d,$0a,$00
str_de_oe
db "Other Error",$0d,$0a,$00
str_nocart
; 0123456789012345678901234567890123456789
db $0d,$0a
db " Cartridge not found.",$00
str_run
; [0123456789012345678901234567890123456789]
db $0d,$0a,$0d,$0a
db " Starting...",$00
str_s_test
; [0123456789012345678901234567890123456789]
db $0d,$0a,$0d,$0a
db " SOUND TEST MODE",$00
hex_tbl
db "0123456789ABCDEF",$00
reg_tbl
db "PC: IY: IX: HL: DE: BC: AF: ",$00
;âXâLâââôâRü[âhâeü[âuâï
scode_tbl
db "01234567" ;00
db "89-^\@[;" ;01
db ":],./_ab" ;02
db "cdefghij" ;03
db "klmnopqr" ;04
db "stuvwxyz" ;05
db $00,$00,$00,$00,$00,$00,$00,$00 ;06
db $00,$00,$1B,$09,$00,$08,$00,$0D ;07
db $20,$00,$00,$00,$1D,$1E,$1F,$1C ;08
db $00,$00,$00,$00,$00,$00,$00,$00 ;09
db $00,$00,$00,$00,$00,$00,$00,$00 ;0a
scode_tbl_shift
db "0!",$22,"#$%&'" ;00
db "()=~|`{+" ;01
db "*}<>?_AB" ;02
db "CDEFGHIJ" ;03
db "KLMNOPQR" ;04
db "STUVWXYZ" ;05
db $00,$00,$00,$00,$00,$00,$00,$00 ;06
db $00,$00,$1B,$09,$00,$08,$00,$0D ;07
db $20,$00,$00,$00,$1D,$1E,$1F,$1C ;08
db $00,$00,$00,$00,$00,$00,$00,$00 ;09
db $00,$00,$00,$00,$00,$00,$00,$00 ;0a
vdp_bios
db $00,$80,$70,$81,$00,$82,$01,$84
db $f5,$87,$00,$40
; include "cb_snd.a80"
;------------
;âfâoâbâOùpâtâbâNâïü[â`âôüB
org $3232
debug_test
ret
include "b_font.z80"
; include "font_fh.z80"
; include "font_sh.z80"
align
org $3FFF
nop
end Start